package com.example.innelop

import org.junit.Test


/**
 * 内置操作符run
 * 持有对象本身this，函数最后一行为返回值
 *
 * @author zhouronghua
 * @time 2022/3/23 11:04 下午
 */
class runTest {

    @Test
    fun testRun() {
        val str = "这是一个好人"
        // 没有设置返回值时为Unit
        val result = str.run {
            println("输入内容$this")
            "哈哈哈哈哈哈哈"
        }
        println(result)
        val str2 = map22Text(result)
        println(str2)
        // 需要增加反射处理(具名函数配置run)
        // 采用{}返回的是一个函数
        val str3 = result.run { ::map22Text }
        println(str3)
        // 多级run链式调用
        val ssss = "我是一个测试字符串"
        val str4 = ssss
            .run(::isLong)
            .run(::showTest)
            .run(::mapText)  // 为什么此处使用{}不可以
        println(str4)
        // 多级输入打印也作为run 的参数
        val str5 = str4.run(::isLong)
            .run(::showTest)
            .run(::mapText)
            .run(::println)
        // =======采用匿名函数使用
        val str6 = ssss.run {
            this.length > 5
        }.run {
            if (this) "你的字符串合格" else "你的字符串不合格"
        }.run {
            "[ $this ]"
        }.run {
            println(this)
            this
        }
    }

    /**
     * 函数返回类型智能推断为String
     * 函数体通过=表示
     *
     */
    fun map22Text(text: String) = "有道是$text"

    /**
     * 字符串是否过长
     *
     * @author zhouronghua
     * @time 2023/4/7 2:44 PM
     */
    fun isLong(str: String) = str.length > 5

    /**
     * 是否是一个合格的字符串
     */
    private fun showTest(isLong: Boolean) = if (isLong) "你的字符串合格" else "你的字符串不合格"

    fun mapText(str: String) = "[ $str ]"
}